本記事では実際にgensimを使って文書のベクトル化をしていく方法について記述していきます。
gensimのDoc2Vecの記述方法と学習に使う文書データの2つについて記述していきます。
Pythonの全体コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#coding: UTF-8 from gensim.models.doc2vec import Doc2Vec from gensim.models.doc2vec import TaggedDocument def main(): # 1行で1文書とし、単語ごとを区切ってあるテキストデータ file = open('../data.txt','r', encoding="utf-8") data = file.readlines() file.close() # words:1文書ずつ、単語に分割したリスト # tags:文書識別用のタグ情報(リストで指定でき、複数のタグをつけることも可能) # for文1回あたりの入力イメージは[TaggedDocument([単語1,単語2,単語3,......],[文書タグ])] trainings = [TaggedDocument(words = data[i].split(),tags = [str(i)]) for i in range(len(data))] # 学習 model = Doc2Vec(documents= trainings, dm = 1, vector_size=100, window=8, min_count=10, workers=4, epochs=100) # モデルの保存("hogehoge"というファイル名で保存) model.save("../model/hogehoge.model") # モデルのロード(既に学習済みのモデルがある場合) # model = Doc2Vec.load("../model/hogehoge.model") # 文書タグ0(1つ目の文書)と類似している文書を上から3件(topnで指定)取得し、文書タグと類似度のセットが返ってくる tag = "0" print (model.dv.most_similar(tag, topn=3)) # 結果イメージ[(タグ, 類似度), ......] # [('10', 0.99978), ('2', 0.98553), ('8', 0.98123)] if __name__ == "__main__": main() |
というのが全体のプログラムの流れになっています。
gensimがインストールされていてPythonが問題なく動くのなら、data.txtファイルさえ用意していただければすぐに動かせると思います。
解説
対して難しいことはしていませんが、少し解説すると、今回重要となっているのは14行目と17行目にある
1 2 |
(14行目) trainings = [TaggedDocument(words = data[i].split(),tags = [str(i)]) for i in range(len(data))] (17行目) model = Doc2Vec(documents= trainings, dm = 1, vector_size=100, window=8, min_count=10, workers=4, epochs=100) |
の2つです。
14行目の方で学習に使う入力データを指定し、17行目でパラメータを設定して実際に学習を行っています。
14行目は学習データをgensimに沿った単語ごとのリストになっていれば方法は何でも大丈夫ですが、今回は簡単な方法であるテキストファイルに単語を分かち書きしたものを使用した例となっています。分かち書きしたテキストデータの簡単な作り方については後ほど。
17行目のパラメータは他にも指定できるパラメータがいくつかあるので各自で調整と設定をすると良いでしょう。(特に気を付けた方が良いのはvector_sizeで、このパラメータでベクトルの次元数を設定できます。次元数が多いほど細かく分類できますが、データ数が多く必要になる傾向があります)
学習データの作成
今回は分かち書きしたテキストファイルを使用しました。
分かち書きとは単語ごとに区切り、空白等で単語と単語を分けて書く記述方法です。
例えば、”すもももももももものうち”という文を分かち書きした場合は”すもも も もも も もも の うち”となります。
記述方法自体は何も難しいものではありません。文書が1つ2つなら人間が単語ごとに区切り分かち書きしても問題ないと言えます。
しかし、実際に学習を行う場合は数百から数千、もしくはもっと多くの文書で学習を行います。その文書全てを人の手で分かち書きするのはあまりにも非効率的です。
そこで、紹介するのが機械的に分かち書きしたテキストファイルを作成する方法です。
形態素解析で分かち書き
人の手で文書を分かち書きにするのは大変であるので、機械的に分かち書きを行う方法を紹介します。いくつか方法はありますが、一番簡単な方法として挙げられるのが形態素解析を用いて形態素を抽出し、その形態素で分かち書きにするというものです。
形態素解析にはMeCabなどいくつか種類があります。MeCabなどPython上で動かすためのライブラリがある便利なものもあるので、簡単に使うことができます。
※今回実装時にはJavaのKuromojiを用いたのでPythonのMeCabの使い方などは割愛します。